The present invention relates generally to a fault tolerant locking mechanism and to the use of such a mechanism in preventing deadlocks in multiprocessor computer systems.
As used herein, the term computer includes any device or machine capable of accepting data, applying prescribed processes to the data, and supplying the results of the processes. A multiprocessing computer system has multiple processes executing on the system. Each process performs a particular task, and the processes, taken as a whole, perform some larger task, typically called an application. These processes may be executing on a single central computer or they may be running on separate computers which are connected to each other via some type of communications link, i.e., a distributed or networked computer system.
In multiprocessing systems, resources are often shared among the executing processes. Such resources may include, for example, disk drives, printers, shared memory and databases. During processing, a process may require exclusive access to a resource, such that another process may not use that resource until the first process is finished with it. Thus, several processes may compete for a finite number of resources. This is commonly known as mutually exclusive sharing of resources.
A problem with mutually exclusive access to resources is the possibility that the computer system will enter a deadlock state. A deadlock state is a state in the computer system in which, because of a resource allocation pattern, the computer system cannot progress past a processing point. For example, consider a computer system with two resources R1 and R2, and two processors P1 and P2, where P1 and P2 both need simultaneous exclusive access to R1 and R2 at some point in order to successfully complete their processing. If P1 gains exclusive access to R1 and R2, then P2 must wait until P1 releases the resources. In this situation, P2 is described as being in a xe2x80x9cwaitxe2x80x9d state. Such a situation does not present a problem, because, it is presumed, that P1 will eventually release the resources, at which time P2 may gain access to the resources. However, consider the situation in which P1 gains access to and holds R1, and P2 gains access to and holds R2, as shown in FIG. 1. If this occurs, then P1 cannot finish its task until it gains access to R2, and P2 cannot finish its task until it gains access to R1, i.e., both P1 and P2 will enter a wait state. However, P1 is holding R1 and will not release R1 until it gains access to R2, and P2 is holding R2 and will not release R2 until it gains access to R1. At this point, the system is in a deadlock state.
Systems and mechanisms for deadlock avoidance and recovery are known in the art and described in U.S. Pat. No. 5,664,088 to Romanovsky et al. and U.S. Pat. No. 5,913,060 to Discavage.
Generally, in the prior art, once a deadlock is detected, one of the processes involved in the deadlock is terminated, so that it releases the resource it held, and the resource can be reclaimed by the system. The reclaimed resource may then be used by a waiting process. If the waiting process can finish processing using the reclaimed resource, then the system can progress past the deadlock state. The terminated process, called the victim, is generally selected on a random basis, or based on a static priority assigned to the processes.
In addition to the xe2x80x9ccircularxe2x80x9d deadlock situation shown in FIG. 1, a deadlock may also be caused by processors failing, or xe2x80x9ccrashing,xe2x80x9d before they release a resource. For example, in the same two processor system described above, assume processor P1 holds resource R1, and processor P2 holds resource R2 and is waiting for R1, as shown in FIG. 2. If processor P1 then unexpectedly crashes while still holding resource R1, P2 remains in a wait state, aware that R1 is busy, but not aware that P1 has crashed. Thus, P2 will wait forever for R1, which is being held by crashed processor P1, causing a deadlock state. Since prior art deadlock avoidance schemes are based on the assumption that processors will never malfunction, these schemes will not prevent deadlocks caused by crashing processors.
In any distributed or parallel computer system, access to shared resources is controlled by some form of a locking mechanism or scheme, whereby a shared resource is committed to, or xe2x80x9clockedxe2x80x9d by, a single holding processor until that processor releases the resource (i.e., releases the xe2x80x9clockxe2x80x9d). To make such a system fault-tolerant, when a lock holding processor (i.e., a processor that has locked a resource) unexpectedly crashes, a rescuing method is needed to prevent system deadlock. The rescue operation will inherently be determined by the locking scheme. Problems may arise when two or more processors try to rescue the same locked resource. The correct behavior is that exactly one of them would succeed. Thus, there is a need for a generic fault-tolerant locking mechanism or scheme that can avoid deadlocks caused by failing processors in a multiprocessor system, especially mission-critical parallel systems where high availability is absolutely necessary. Such a mechanism will enable waiting processors to identify a locked resource held by a failed processor, and xe2x80x9crescuexe2x80x9d the resource from the hold of its failed processor, by changing, or xe2x80x9cre-setting,xe2x80x9d a lock associated with the resource. A single waiting processor will then rescue a resource to prevent the potential deadlock from locking up all other processors waiting for the same resource.
In a preferred embodiment, the present invention is a match-and-set lock for controlling access to a resource that is shared among a plurality of users N. The lock has a locked operating state and an unlocked operating state controlled by a value C such that the lock is in its locked operating state when Cxe2x89xa00 and in its unlocked operating state where C=0. The lock returns a value R, equal to the lock""s current content C, to an inquiring user seeking access to the resource. A return value R=0 usually denotes that the resource is free, and a return value Rxe2x89xa00 denotes that the resource is locked by another user. The lock is responsive to an atomic command in the form (A, B), such that the lock substitutes B for C if A=C. Thus, the lock may be obtained/locked by issuing the command (A, B) where A=C and Bxe2x89xa00; and the lock may be released by issuing the command (A, B) where A=C and B=0.
In accordance with the invention, a deadlock condition may be avoided by setting the lock to the value B=P+T*(N+1). Here N is the total number of users, P is an integer within [1, N] that identifies the current user issuing the command (A, B), and T is the current global time stamp. When the lock is set in this fashion, a return value of Rxe2x89xa00, identifies the user currently locking the resource (via Pxe2x80x2=R mod (N+1)) and the time when that user locked the resource (via Txe2x80x2=R/(N+1)). If the inquiring user determines that the user currently locking the resource has failed or restarted since locking the resource, this inquiring user can reset the lock by issuing the command (R, B). Here B=P+T*(N+1), P identifies this new user issuing the command, and T is the current time stamp; in so doing, the inquiring user gains access to the resource. If there are multiple users trying to issue this type of command (R, B) (of course, with different values of B for each inquiring user), then exactly one of them will succeed. This is because the very first of them that has succeeded will have changed the content of the lock to something different from Rxe2x80x2 causing all others to fail. When the inquiring user is finished with the resource, the user can reset the current content of the lock to C=0, to signal to other users that the resource is again free. The plurality of users may be processors in a multiprocessor computer system, and the processors may form a telecommunications system.
In another preferred embodiment, the invention is a software program implemented in a multiprocessor computer system, the software program controlling access to a shared resource from a plurality of processors N, by employing a match-and-set lock that has a current content C and that is responsive to a match-and-set command (A, B) that writes B into the current content if A=C. The lock commits the shared resource to the control of that processor that most recently set the current content to a non-zero value. The software program enables the multiprocessor system to: (a) initialize the lock by setting the current content to zero; (b) issue from one of the processors a command (M, S) where M equals an expected current content of the lock and S=P+T*(N+1) where P less than (N+1) and identifies the processor issuing the command and T is a current time stamp; (c) if a non-zero value R is returned from the lock, identify the processor that set the lock as Pxe2x80x2=R% (N+1) where R% (N+1) is the remainder of R, mod (N+1), and identify the approximate locking time as Txe2x80x2=R/(N+1); (d) if processor Pxe2x80x2 is still operating and was last started before time Txe2x80x2, repeat step (b); in the alternative, (e) if processor Pxe2x80x2 is not still operating or was last started after time Txe2x80x2, issue from processor P the command (M, S) where M=R. The users may be processors in a multiprocessor computer system, and the processors may form a telecommunications system.
In still another preferred embodiment, the invention is a method for controlling access to a shared resource from a plurality of processors N, comprising the steps of: (a) providing the resource with a locking storage function, wherein the function stores either an initial value denoting that the resource is not currently held by a processor or a value denoting a holding processor, currently holding the resource, if any, and an initial holding time when such holding began; (b) initializing the function by storing an initial value denoting that the resource is not currently held by a processor; (c) querying the function to determine if the resource is currently held by a processor; (d) if the resource is not currently held by a processor, providing to an inquiring processor access to the resource and resetting the value of the function to denote the inquiring processor""s identity and a current time; in the alternative, (e) if the resource is currently held by a processor, determining if the holding processor has failed or been restarted since taking hold of the resource; (f) if the holding processor has failed or been restarted since taking hold of the resource, providing to the inquiring processor access to the resource and resetting the value of the function to denote the inquiring processor""s identity and a current time; in the alternative, (g) if the holding processor has not failed or been restarted since taking hold of the resource, repeating steps (b) through (d); and (h) upon release of the resource, resetting the value stored in the function to an initial value denoting that the resource is not currently held by a processor. The plurality of processors N may form a telecommunications system.
In still another preferred embodiment, the invention is a method of controlling access to a shared resource from a plurality of processors N, the method employing a match-and-set lock that has a current content C and that is responsive to a match-and-set command (A, B) that writes B into the current content if A=C. The lock commits the shared resource to the control of that processor that most recently set the current content to a non-zero value. The method comprises the steps of: (a) initializing the lock by setting the current content to zero; (b) issuing from one of the processors a command (M, S) where M equals an expected current content of the lock and S=P+T*(N+1) where P less than (N+1) and identifies the processor issuing the command and T is a current time stamp; (c) if a non-zero value R is returned from the time lock, identifying the processor that set the lock as Pxe2x80x2=R% (N+1) where R% (N+1) is the remainder of R, mod (N+1), and identifying the approximate locking time as Txe2x80x2=R/(N+1); (d) if processor Pxe2x80x2 is still operating and was last started before time Txe2x80x2, repeating step (b); in the alternative, (e) if processor Pxe2x80x2 is not still operating or was last started after time Txe2x80x2, issuing from processor P the command (M, S) where M=R. The plurality of processors N may form a telecommunications system.
Using pseudo algorithmic language, the invention of fault-tolerant locking mechanism can be summarized as follows: here time( ) returns the current global time, N is the total number of users, my_id( ) returns the calling user""s id (between 1 and N), alive(p) returns TRUE is user p is still running, and start_time(p) returns the latest reboot time of user p.